package com.it.upgradesystem;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class AppTest {
    public static void main(String[] args) {
        ArrayList<App> list = new ArrayList<>();
        //先创建一个菜单目录，登入界面
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("-----欢迎来到学生成长管理系统-----");
            System.out.println("请选择操作 1登录 2注册 3忘记密码 4退出");
            int choice = sc.nextInt();
            switch (choice) {
                case 1 -> login(list);
                case 2 -> register(list);
                case 3 -> forgetPassword(list);
                case 4 ->{
                    System.out.println("退出");
                    System.exit(0);
                }
                default -> System.out.println("没有这个选项,请重新输入");
            }
        }
    }

    public static void login(ArrayList<App> list) {
        //System.out.println("登录");
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名：");
            String username = sc.nextLine();
            boolean flag = contains(list, username);
            if (!flag) {
                System.out.println("该用户名未注册，请先注册再登录");
                return;
            }
            System.out.println("请输入密码");
            String password = sc.nextLine();

            //验证码的判断
            while (true) {
                String rightCode = getCode();
                System.out.println("当前验证码为：" + rightCode);
                System.out.println("请输入当前验证码：");
                String code = sc.nextLine();
                if (code.equalsIgnoreCase(rightCode)) {
                    System.out.println("验证码输入正确");
                    break;
                } else {
                    System.out.println("验证码输入错误，请重新输入");
                    continue;
                }
            }

            //验证用户名和密码是否正确
            //集合中是否包含用户名和密码
            //定义一个方法来同时验证用户名和密码

            //封装思想的应用
            //将零散的数据进行封装，为一个对象
            //之后传递一个整体就可以了
            App useInfo = new App(username, password, null, null);
            boolean result = checkUserInfo(list, useInfo);
            if (result) {
                System.out.println("登录成功，可以使用学生成长管理系统了");
                //创建对象调用方法，启动学生成长管理系统
                My_StudentSystem ss = new My_StudentSystem();
                ss.startMy_StudentSystem();
                break;
            } else {
                System.out.println("登录失败，用户名或密码错误");
                if(i == 2){
                    System.out.println("当前帐号"+username+"已被锁住,请联系有关人员");
                }else{
                    System.out.println("登录失败，用户名或密码错误。您还剩"+(2-i)+"次机会");
                }
            }
        }
    }

    public static void register(ArrayList<App> list) {
        //System.out.println("注册");
        //1.键盘录入用户名
        Scanner sc = new Scanner(System.in);
        String username;
        while (true) {
            System.out.println("请输入用户名：");
            username = sc.nextLine();
            //判断输入的用户名格式是否正确
            boolean flag1 = checkUserName(username);
            if (!flag1) {
                System.out.println("当前用户名不满足格式，请重新输入");
                continue;
            }
            //判断用户名的唯一性
            boolean flag2 = contains(list, username);
            if (flag2) {
                System.out.println("用户" + username + "已经存在，请重新注册");
            } else {
                System.out.println("用户" + username + "可用");
                break;
            }
        }

            //2.键盘输入密码
            String password;
            while (true) {
                System.out.println("请输入您要注册的密码");
                password = sc.nextLine();
                System.out.println("请再次输入您要注册的密码");
                String againPassword = sc.nextLine();
                if (!(password.equals(againPassword))) {
                    System.out.println("密码不一致,请重新输入");
                    continue;
                } else {
                    System.out.println("密码一致,继续录入其他信息");
                    break;
                }
            }

            //键盘输入身份证号码
            String personID;
            while(true) {
                System.out.println("请输入身份证号码：");
                personID = sc.nextLine();
                boolean flag = checkPersonID(personID);
                if (flag) {
                    System.out.println("身份证号码输入成功，请继续其他操作");
                    break;
                } else {
                    System.out.println("身份证号码输入有误，请重新输入");
                    continue;
                }
            }

            //键盘录入手机号码
            String phoneNumber;
            while(true) {
                System.out.println("请输入手机号码");
                phoneNumber = sc.nextLine();
                boolean flag = checkPhoneNumber(phoneNumber);
                if (flag) {
                    System.out.println("手机号输入成功");
                    break;
                } else {
                    System.out.println("手机号输入有误，请重新输入");
                    continue;
                }
            }
            System.out.println("注册成功");
            App u = new App(username, password, personID, phoneNumber);
            list.add(u);

            //校验
            printlist(list);

        }

    public static void printlist(ArrayList<App> list) {
        for (int i = 0; i < list.size(); i++) {
            App user = list.get(i);
            System.out.println(user.getUname()+","+user.getPassword()+","
                    +user.getIdCardNumber()+","+user.getPhoneNumber());
        }
    }

    public static void forgetPassword(ArrayList<App> list) {
        //System.out.println("忘记密码");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名：");
        String username = sc.nextLine();
        boolean flag = contains(list,username);
        if (!flag) {
            System.out.println("用户名"+username+"未注册");
            return;
        }

        //键盘录入身份证号码和手机号码
        System.out.println("请输入身份证号码：");
        String PersonID = sc.nextLine();
        System.out.println("请输入手机号码：");
        String PhoneNumber = sc.nextLine();

        //要判断身份证号码和手机号码是否正确
        //就要获取集合里用户的与之做对比
        int index = getIndex(list, username);
        App user = list.get(index);
        if(!(user.getPhoneNumber().equalsIgnoreCase(PhoneNumber)) && (user.getIdCardNumber().equalsIgnoreCase(PersonID))) {
            System.out.println("身份证号码或手机号码有误，不能修改密码");
            return;
        }
        //验证完毕，修改密码
        String password;
        while(true) {
            System.out.println("请输入要修改的密码");
            password = sc.nextLine();
            System.out.println("请再次输入密码");
            String againPassword = sc.nextLine();
            if (password.equals(againPassword)) {
                System.out.println("密码输入一致");
                break;
            } else {
                System.out.println("密码输入有误，请重新输入");
                continue;
            }
        }

        //直接修改密码即可
        user.setPassword(password);
        System.out.println("密码修改成功");

    }

    public static int getIndex(ArrayList<App> list,String username) {
        //获取索引
        for (int i = 0; i < list.size(); i++) {
            App user = list.get(i);
            if(user.getUname().equals(username)){
                return i;
            }
        }
        return -1;
    }

    public static boolean checkUserName(String username) {
        //判断用户名的格式是否正确
        int len = username.length();
        if(len<3 || len>15){
            return false;
        }
        
        for (int i = 0; i < username.length(); i++) {
            char c = username.charAt(i);
            if(!((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))){
                return false;
            }
        }

        //计数器计算有多少个字符在'a'~'z','A'~'Z'中
        int count = 0;
        for (int i = 0; i < username.length(); i++) {
            char c = username.charAt(i);
            if((c>='a' && c<='z') || (c>='A' && c<='Z')){
                count++;
                //a123当第一个已经判断为字母了，就不用再继续执行了
                break;
            }
        }
        return count > 0;
    }

    public static boolean contains(ArrayList<App> list, String username) {
        //判断用户的唯一性
        //循环遍历集合得到每一个用户对象
        //拿着用户对象中的用户名进行比较
        for (int i = 0; i < list.size(); i++) {
            App user = list.get(i);
            String rightusername = user.getUname();
            if(rightusername.equals(username)) {
                return true;
            }
        }
        return false;
    }
    
    public static boolean checkPersonID(String personID) {
        //长度为18才满足
        if(!(personID.length() == 18)){
            return false;
        }
        //身份证号码第一位不能为‘0’
        if(personID.charAt(0) == '0'){
            return false;
        }
        //前17位必须为数字
        for (int i = 0; i < personID.length()-1; i++) {
            char c1 = personID.charAt(i);
            if(!(c1 >='0' && c1<='9')){
                return false;
            }
        }
        //最后一个字符，判断是否再0~9之间还是为‘x''X'，满足则符合要求
        char endChar = personID.charAt(personID.length()-1);
        if((endChar >= '0' && endChar <= '9') || (endChar == 'X') || (endChar == 'x')){
            return true;
        }else{
            return false;
        }
    }

    public static boolean checkPhoneNumber(String phoneNumber) {
        //长度为11
        if(phoneNumber.length() != 11){
            return false;
        }
        //不能以0为开头
        if(phoneNumber.charAt(0) == '0'){
            return false;
        }
        //必须都是数字
        for (int i = 0; i < phoneNumber.length(); i++) {
            char c = phoneNumber.charAt(i);
            if(!(c>='0' && c<='9')){
                return false;
            }
        }
        return true;
    }

    public static String getCode(){
        //先创建一个集合，将52个字母存入
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            list.add((char)('a'+i));
            list.add((char)('A'+i));
        }
        StringBuilder sb = new StringBuilder();
        //随机抽取四个字符
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            //获取索引
            int index = r.nextInt(list.size());
            //利用随机索引获取字符，并添加到StringBuilder类中
            sb.append(list.get(index));
        }
        //将一个随机数字添加到末尾
        int number = r.nextInt(10);
        sb.append(number);
        //将最后一位数字与随机数字进行交换
        //如果我们要修改字符串中的内容，就要先将其变成字符数组
        char[] arr = sb.toString().toCharArray();
        int randomIndex = r.nextInt(arr.length);
        char temp = arr[randomIndex];
        arr[randomIndex] = arr[arr.length-1];
        arr[arr.length-1] = temp;
        return new String(arr);
    }

    public static boolean checkUserInfo(ArrayList<App> list, App useInfo) {
        //遍历集合，判断用户名和密码是否存在，如果存在则登录成功，不存在则登录失败
        for (int i = 0; i < list.size(); i++) {
            App user = list.get(i);
            if((user.getUname().equals(useInfo.getUname())) && (user.getPassword().equals(useInfo.getPassword()))) {
                return true;
            }
        }
        return false;
    }

}
